/*
 * atributo.java
 *
 * Created on 5 de Maio de 2007, 20:56
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package org.jerm.Mapeamento.Atributos;

import org.jerm.Mapeamento.Tabelas.Tabela;

/**
 *Classe de Atributo Generica, 
 *Para nenhum tipo especifico. 
 *<BR>Implementa: 
 * Nome, 
 * Tipo. 
 *
 *@author Tiago Falcao
 *@version 1.0b 15/05/07
 */
public class Atributo extends Object{
    /**
     * Nome do Atributo
     */
    protected String Nome;          //Nome do Atributo
    /**
     * Tipo do Atributo em LowerCase
     */
    protected String Tipo;          //
    
    public boolean MultiValorado=false;
    /**
     * Tabela do atributo
     */
    protected Tabela TabelaInserida;
    
    /**
     * Cria nova Instacia da Clase Atributo
     */
    public Atributo()
    {
        this.Nome=new String();
        this.Tipo=new String();
    }
    
    /**
     * Cria nova Instacia da Clase Atributo
     */
    public Atributo(String Nome)
    {
        this.Nome = Nome;
        this.Tipo = new String();
    }
    
    public void loadArray(Object[] o){
        if(o.length!=13)
            return;
        Nome=(String)o[0];
        Tipo=(String)o[1];
        MultiValorado=((Boolean)o[12]).booleanValue();
    }
    
    public Object[] getArray(){
        Object[] o=new Object[13];
        o[0]=Nome;
        o[1]=Tipo;
        o[2]=new Boolean(false);
        o[3]=new String();
        o[4]=new Boolean(false);
        o[5]=new Boolean(false);
        o[6]=new Boolean(false);
        o[7]=new Integer(0);
        o[8]=new Integer(0);
        o[9]=new String();
        o[10]=new String();
        o[11]=new String();
        o[12]=new Boolean(MultiValorado);
        return o;
    }
    
    
    
    /**
     * Atribui Nome ao atributo
     * @param Nome Nome do atributo
     */
    public void setNome(String Nome)
    {
        this.Nome=Nome;
    }
    
    /**
     * Atribui o Tipo ao Atributo
     * @param Tipo Tipo do atributo
     * @throws java.lang.Exception Nunca, pois � uma classe generica
     */
    public void setTipo(String Tipo) throws Exception
    {
        this.Tipo=Tipo.toLowerCase ();
    }
    
    /**
     * Retorna Nome do Atributo formatado para o SGBD
     * @param SGBD Nome do SGBD para o qual sera gerado o SQL
     * @return String com Nome do Atributo Formatado
     * @throws java.lang.Exception Se Atributo n�o Possuir Nome
     */
    protected String getNomeSQL(String SGBD) throws Exception
    {
        if(this.Nome.length ()==0)
            throw new java.lang.Exception("Atributo sem Nome");
        return this.Nome;
    }
    
    
    /**
     * Retorna Nome do Atributo formatado para o SGBD
     * @param SGBD Nome do SGBD para o qual sera gerado o SQL
     * @return String com  Tipo do Atributo Formatado
     * @throws java.lang.Exception Se Atributo n�o possuir Tipo definido
     */
    protected String getTipoSQL(String SGBD) throws Exception
    {
        if(this.Tipo.length ()==0)
            throw new java.lang.Exception("Tipo nao Definido");
        if(SGBD=="MYSQL")
        {
            if(this.Tipo.equalsIgnoreCase("bigserial"))
                return "bigint unsigned\tNOT NULL\tauto_increment";
            if(this.Tipo.equalsIgnoreCase("serial"))
                return "int unsigned\tNOT NULL\tauto_increment";
        }
        return this.Tipo;
    }
    
    
    /**
     * Retorna o Nome do atributo
     * @return Retorna o Nome do atributo
     */
    public String getNome()
    {
        return Nome;
    }
    
    
    /**
     * Retorna o Tipo do atributo
     * @return Retorna o Tipo do atributo
     */
    public String getTipo()
    {
        return Tipo;
    }
    
    
    /**
     * Retorna o codigo SQL para criacao do atributo sem SGBD especifico
     * @return Retorna a string SQL do atributo ou levanta excecao caso o atributo nao tenha nome/tipo
     * @throws java.lang.Exception Se Atributo, n�o possuir Nome ou Tipo
     */
    public String getSQL() throws Exception
    {
        return this.getSQL("SQL");
    }
    
    /**
     * Retorna parte do SQL para criacao do Atributo para o SGBD especificado, 
     * sem o Nome do Atributo.
     * @param SGBD Nome do SGBD para o qual sera gerado o SQL
     * @return String SQL para cofiguracao do Atributo
     * @throws java.lang.Exception Se Atributo n�o possuir Nome ou Tipo
     */
    public String getInfoSQL(String SGBD) throws Exception
    {
        return "\t"+this.getTipoSQL (SGBD);
    }
    
    
    /**
     * Retorna codigo SQL para criacao do Atributo para o SGBD especificado.
     * @param SGBD Nome do SGBD para o qual sera gerado o SQL
     * @return String SQL para criacao do Atributo
     * @throws java.lang.Exception Se Atributo n�o possuir Nome ou Tipo
     */
    public String getSQL(String SGBD) throws Exception
    {
        return this.getNomeSQL (SGBD)+this.getInfoSQL (SGBD)+",";
    }
    
    
//    public static void main(String[] args) 
//    {
//        new Atributo().run();
//
//    }
//    
//    private void run(){
//        AtributoSerial aserial;
//        AtributoBoolean aboolean;
//        AtributoNumero anumero;
//        AtributoDecimal adecimal;
//        AtributoEnum aenum;
//        AtributoCaracter acaracter;
//        AtributoTexto atexto;
//        FK fk;
//        Tabela tabela;
//        
//        tabela=new Tabela();
//        tabela.setNome("MinhaTabela");
//        
//        try
//        {
//            anumero=new AtributoNumero();
//            anumero.setNome("ID");
//            anumero.setTipo("Int");
//            anumero.setUnsigned(true);
//            anumero.setPadrao("NULL");
//            anumero.setNulo(false);
//            //System.out.println(anumero.getSQL());
//            
//            tabela.addPrimo(anumero);
//        } catch (Exception ex)
//        {
//            ex.printStackTrace();
//        }
//        
//        try
//        {
//            acaracter=new AtributoCaracter();
//            acaracter.setNome("Nome");
//            acaracter.setTipo("varchar");
//            acaracter.setTamanho (10);
//            acaracter.setCharSet("utf8");
//            acaracter.setCollate("utf8-bin");
//            acaracter.setNulo(false);
//            tabela.addAtributo(acaracter);
//            
//            fk=new FK();
//            fk.setNome("NomeChave");
//            fk.setReferencia (tabela,acaracter);
//            tabela.addFKPrimo(fk);
//        } catch (Exception ex)
//        {
//            ex.printStackTrace();
//        }
//        
//        
//        try
//        {
//            aserial=new AtributoSerial();
//            aserial.setNome("Idade");
//            aserial.setTipo("bigserial");
//            tabela.addAtributo(aserial);
//            
//            fk=new FK();
//            fk.setNome("Idade2");
//            fk.setReferencia (tabela,aserial);
//            tabela.addFK(fk);
//        } catch (Exception ex)
//        {
//            ex.printStackTrace();
//        }
//        
//        
//        try
//        {
//            aenum=new AtributoEnum();
//            aenum.setNome("Formacao");
//            aenum.setTipo("ENUM");
//            aenum.setPadrao("NULL");
//            aenum.setNulo(true);
//            aenum.setLista("Analfabeto,Afabetizado,Superior");
////            aenum.addItem("Analfabeto");
////            aenum.addItem("Afabetizado");
////            aenum.addItem("Fundamental");
////            aenum.addItem("Medio");
////            aenum.addItem("Superior");
//            tabela.addAtributo(aenum);
//        } catch (Exception ex)
//        {
//            ex.printStackTrace();
//        }
//        
//        
//        System.out.println(tabela.getMER());
//        try
//        {
//            System.out.println(tabela.getSQL("MYSQL"));
//            System.out.println(tabela.getSQL());
//        } catch (Exception ex)
//        {
//            ex.printStackTrace();
//        }
//    }
}